package com.han.hotelplat.comm.utils;

import java.util.Map;

import com.han.hotelplat.model.AreaModel;


/**
 * 
 * @author lkm
 * @version Created on 2017年10月17日 下午4:48:49
 */
public class AreaHelp {
	
	private AreaHelp() {
	}

	private static AreaHelp instance = new AreaHelp();

	public static AreaHelp getInstance() {
		return instance;
	}
	/**
	 * 注入所有的区域。不怕并发。 这里只会在系统启动的时候被调用。
	 * @param list
	 */
	public void set(Map<String, AreaModel> areaModelIndex) {
//		areaCodeIndex.clear();
//		for (AreaModel areaModel : list) {
//			areaCodeIndex.put(areaModel.getCode(), areaModel);
//		}
		areaCodeIndex=areaModelIndex;
		
	}
	
	/**
	 * 地域码索引
	 */
	private Map<String, AreaModel> areaCodeIndex;//=new HashMap<>();

	/**
	 * 0 省 1市 2区
	 * @param code
	 * @return 
	 * 省 就直接返回 1长度
	 * 市 就直接返回 2长度
	 * 区 就直接返回 3长度
	 * 
	 */
	public AreaModel[] getAreaModels(String code) {
		if(code==null)return null;
		//肯定区域的关系是正常的  所有不会存在areaModel.getParent().getParent() 为空异常
		AreaModel areaModel=areaCodeIndex.get(code);
		if(areaModel!=null) {
			if(areaModel.isProvince()) {
				return new AreaModel[] {areaModel};
			}else if(areaModel.isCity()) {
				return new AreaModel[] {areaModel.getParent(),areaModel};
			}else if(areaModel.isDistrict()) {
				return new AreaModel[] {areaModel.getParent().getParent(),areaModel.getParent(),areaModel};
			}
		}
		return null;
	}
	public AreaModel getAreaModel(String code) {
		return areaCodeIndex.get(code);
	}
	
	public AreaModel[] getProvinces(String code) {
		return areaCodeIndex.get(code).getChilds();
	}
	
	public AreaModel[] getChinaProvinces() {
		return areaCodeIndex.get("100000").getChilds();
	}
	//按市级归类
	public String getCity(Integer areaCode){
		if(!areaCode.toString().endsWith("00")){
			return "格式错误";
		}
		String code = areaCode.toString().substring(0, 2);
		Integer areaCodeTmp = Integer.parseInt(code)*10000;//取到省级
		AreaModel areaModel = AreaHelp.getInstance().getAreaModel(areaCodeTmp+"");
		code = areaCode.toString().substring(0, 4);
		areaCode = Integer.parseInt(code) * 100;//取到市级
		for(AreaModel a :areaModel.getChilds()){
			if(a.getCode().equals(areaCode.toString())){
				return a.getName();
			}
		}
		return "格式错误";
	}
	
	//按省级归类
	public String getProvince(Integer areaCode){
		if(!areaCode.toString().endsWith("00")){
			return "格式错误";
		}
		String code = areaCode.toString().substring(0, 2);
		Integer areaCodeTmp = Integer.parseInt(code)*10000;//取到省级
		AreaModel areaModel = AreaHelp.getInstance().getAreaModel(areaCodeTmp+"");
		code = areaCode.toString().substring(0, 4);
		areaCode = Integer.parseInt(code) * 100;//取到市级
		int codeTmp = areaCode%10000;//取到省级
		if(codeTmp == 0){
			if(areaModel.getCode().equals(areaCode.toString())){
				return areaModel.getName();
			}
		}
		return "格式错误";
	}
}
